/*
 * Copyright © 2025 秋辞未寒 (545073804@qq.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.gitee.colordreams.mapstruct.convert.util;

import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 对象工具类
 *
 * @author 秋辞未寒
 */
public class ObjectUtil {

    private ObjectUtil() {}

    /**
     * 判断对象是否为空
     *
     * @param obj 对象
     * @return true-对象为空/false-对象不为空
     */
    public static boolean isNull(Object obj) {
        return Objects.isNull(obj);
    }

    /**
     * 判断对象是否不为空
     *
     * @param obj 对象
     * @return true-对象不为空/false-对象为空
     */
    public static boolean isNotNull(Object obj) {
        return !isNull(obj);
    }

    /**
     * 判断对象是否为空，如果对象为空则返回默认值
     *
     * @param obj 对象
     * @param defaultValue 默认值
     * @return 对象/默认值
     */
    public static <T> T defaultIfNull(final T obj, final T defaultValue) {
        return isNull(obj) ? defaultValue : obj;
    }

    /**
     * 判断对象是否为空，如果对象为空则返回默认值
     *
     * @param obj 对象
     * @param defaultValueSupplier 默认值提供者
     * @return 默认值
     */
    public static <T> T defaultIfNull(final T obj, final Supplier< T> defaultValueSupplier) {
        return isNull(obj)? defaultValueSupplier.get() :obj;
    }

    /**
     * 如果对象不为空，则获取对象属性值，否则返回null
     *
     * @param obj 对象
     * @param getterFunc 属性获取函数
     * @return 属性值
     */
    public static <T,E> E ifNotNullGetter(final T obj, final Function<T,E> getterFunc) {
        if (isNotNull(obj)) {
            return getterFunc.apply(obj);
        }
        return null;
    }

    /**
     * 如果对象不为空，则获取对象属性值，否则返回默认值
     *
     * @param obj 对象
     * @param getterFunc 属性获取函数
     * @param defaultValue 默认值
     * @return 属性值/默认值
     */
    public static <T,E> E ifNotNullGetter(final T obj, final Function<T,E> getterFunc, final E defaultValue) {
        if (isNotNull(obj)) {
            return getterFunc.apply(obj);
        }
        return defaultValue;
    }

    /**
     * 如果对象不为空，则获取对象属性值，否则返回默认值
     *
     * @param obj 对象
     * @param getterFunc 属性获取函数
     * @param defaultValueSupplier 默认值提供者
     * @return 属性值/默认值
     */
    public static <T,E> E ifNotNullGetter(final T obj, final Function<T,E> getterFunc, final Supplier<E> defaultValueSupplier) {
        if (isNotNull(obj)) {
            return getterFunc.apply(obj);
        }
        return defaultValueSupplier.get();
    }

}
